'''
Author: 吴泳良
Date: 2021-08-18 14:51:40
LastEditTime: 2021-08-18 15:30:30
Description: Python高级特性
'''
from collections.abc import Iterable
# 切片
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
# 取前三个元素
print(L[0:3])
# 取后三个元素
print(L[-3:])
# 每隔一个取一个
print(L[::2])
# str和元组的操作同上


# 迭代
d = {'a': 1, 'b': 2, 'c': 3}
for key, value in d.items():
    print(key, value)
# 通过from collections.abc import Iterable判断是否可以迭代
print(isinstance('abc', Iterable))


# 列表生成式，创建list
L = [x * x for x in range(1, 11) if x % 2 == 0]
print(L)
# 在一个列表生成式中
# for前面的if ... else是表达式
# 而for后面的if是过滤条件，不能带else


# 生成器：generator,类似于列表生成式
# 在循环的过程中不断推算出后续的元素
# 区别仅在于最外层的[]和()
L = (x * x for x in range(1, 11) if x % 2 == 0)
# 生成器函数碰到yield就返回，再次调用next从上次返回的地方继续执行


def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield(3)
    print('step 3')
    yield(5)


o = odd()
next(o)
next(o)
next(o)


def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'


for n in fib(6):
    print(n)


# 迭代器
# Iterator对象表示的是一个数据流
# Iterator对象可以被next()函数调用并不断返回下一个数据
# 生成器都是Iterator对象
# list、dict、str虽然是Iterable，却不是Iterator
for x in [1, 2, 3, 4, 5]:
    pass
# 等价
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break
